iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
自我挑戰組

Effective C++ 讀書筆記系列 第 4

[Day 4] Prefer const, enum, and inline to #define(2)

  • 分享至 

  • xImage
  •  

前言

接續前一天的內容,繼續來看enum與inline應該在哪邊取代掉#define。

enum hack

來看看以下範例:

class GamePlayer{
private:
    enum
    { 
        NumsTurns = 5
    };
    int score[NumTurns];

這是做啥?利用Enum可以被用在compile的時候需要用int的地方的特性,就可以解決前面提到的如果比較早期的編譯器被迫不能在宣告時定義值的時候拿來用。

知道"enum hack"有什麼好處?

  1. Enum hack在某些方面看起來比起"const",更像是"#define"的運作,而有時我們就需要這種特性。例如我們不希望某個值的address被參考的時候,const的address是可以被取得的,但#define跟enum就不行。另外enum也永遠不會被額外分配記憶體,跟#define一樣,但const就比較不一定。
  2. 有些程式會這樣用,所以我們必須了解。

使用inline取代#define

還有一個不該使用#define的地方就是把一些像是function的用法塞到#define,
範例:

#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))

這時就可以使用"inline"來取代:

template<typeName T>
inline void callWithMax(const T&a, const T&b)
{
    f(a>b?a:b);
}

好處:

  • 不需要在call with max裡面加一堆括號,要加是因為preprocessor是直接把裡面的內容替換掉,如果傳入的是一句expression就會遇到問題(可參考: [C 語言] 程式設計教學:如何使用巨集 (macro) 或前置處理器 (Preprocessor))
  • 用inline,這就真的是一個函式,所以那些scope或access rule都不會亂掉。
    至於inline是啥,簡單來說跟macro的差別就是一個是在preprocessor取代,一個是在compiler階段取代掉。

總結

貼心重點提醒:

  • For simple constants, prefer "const" objects or enums to #define
  • For function-like macros, prefer inline functions to #define

簡單來說就是看一下#define用在哪,如果是簡單的常數,可以考慮直接用const取代掉;如果是比較複雜的function,就用inline functions。總之就是把一些preprocessor時就做掉的行為延到compiler,避免程式compile時難以追溯的錯誤。

補充

(皆取自參考資料)

  • enum: An enumeration is a user-defined type that consists of a set of named integral constants that are known as enumerators.
  • inline: inline 關鍵字會指示編譯器針對函式呼叫的每個執行個體,取代函式定義內的程式碼。使用內嵌函式可以讓程式更快速,因為它們不需要與函式呼叫相關聯的負荷。

參考資料


上一篇
[Day 3] Prefer const, enum, and inline to #define (1)
下一篇
[Day 5] Use const whenever possible (1)
系列文
Effective C++ 讀書筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言